freeslot(
	"MT_EGGSPIN",
	"S_SPINSTAND",
	"S_SPINLOOK",
	"S_SPINACT",
	"S_SPINSPAWN",
	"S_SPINSHOT",
	"S_SPINPAIN",
	"S_SPINJET",
	"S_SPINSPIK",
	"S_GROUNDMACE",
	"S_SPIKED",
	"S_SPIKED2",
	"S_SPIKED3",
	"S_SPINSPIK2",
	"S_SPINSPIK3",
	"S_SPINSPIK4",
	"S_FLYPAIN",
	"S_FLYACT",
	"S_FLYLOOK",
	"S_FLYHIT",
	"S_FLYDIE",
	"S_FLYDIE2",
	"S_FLYDIE3",
	"S_FLYTUR",
	"S_FLYCOOL",
	"S_FLYSTAND",
	"S_SPINHIT",
	"S_SPINBOUNCE",
	"SPR_ROTP",
	"SPR_SPNR",
	"SPR_SPBR",
	"SPR_SPCR",
	"SPR_EORM",
	"SPR_FITE",
	"SPR_FLRP",
	"SPR_FLED"
)
mobjinfo[MT_EGGSPIN] = {
	doomednum = 2220,
	spawnstate = S_SPINSPAWN,
	seestate = S_SPINACT,
	reactiontime = 16,
	painstate = S_SPINPAIN,
	deathstate = S_FLYDIE,
	painsound = sfx_dmpain,
	deathsound = sfx_cybdth,
	spawnhealth = 13,
	speed = 50,
	radius = 128*FRACUNIT,
	height = 252*FRACUNIT,
	dispoffset = 0,
	damage = 0,
	activesound = sfx_None,
	flags = MF_BOSS|MF_SPECIAL|MF_SHOOTABLE|MF_FLOAT,
}
function A_SPINBRANCH(actor, var1, var2) 
	local states = {
		S_SPINSHOT,
		S_SPINJET, 
		S_SPINSPIK, 
		S_GROUNDMACE,
		S_SPINSHOT,
		S_SPINJET, 
		S_SPINSPIK, 
		S_GROUNDMACE, 
		S_FLYTUR, 
		S_FLYTUR,
		S_FLYTUR,
		S_FLYTUR
	}
	actor.state = states[14-actor.health]
end

function A_lexicute(actor, var1, var2) 
	if (actor.target.player) then
		actor.target.player.pflags = $|PF_THOKKED
	end
	P_InstaThrust(actor.target, actor.angle, FRACUNIT*50)
	P_SetObjectMomZ(actor.target, FRACUNIT*10)
	actor.astep = 1
	actor.asubstep = 0
	P_LinedefExecute(300+(12-actor.health))
	A_Scream(actor, 0, 0)
	S_StartSound(actor.target, 101)
end


local function SPYK()
    for mobj in mobjs.iterate() do
        if mobj.type == MT_EGGSPIN then
			mobj.state = S_SPINSPIK
            return
        end
    end
end
local function DIES()
    for mobj in mobjs.iterate() do
        if mobj.type == MT_EGGSPIN then
			mobj.state = S_FLYDIE
            return
        end
    end
end
local function SPOOT()
    for mobj in mobjs.iterate() do
        if mobj.type == MT_EGGSPIN then
			mobj.state = S_SPINSHOT
            return
        end
    end
end
local function SPNF()
    for mobj in mobjs.iterate() do
        if mobj.type == MT_EGGSPIN then
            mobj.state = S_FLYSTAND
			mobj.info.seestate = S_FLYACT
			mobj.info.painstate = S_FLYPAIN
			mobj.info.spawnstate = S_FLYCOOL
            return
        end
    end
end
local function SPIJ()
    for mobj in mobjs.iterate() do
        if mobj.type == MT_EGGSPIN then
			mobj.state = S_SPINJET
            return
        end
    end
end
local function SPAC()
    for mobj in mobjs.iterate() do
        if mobj.type == MT_EGGSPIN then
			mobj.state = S_GROUNDMACE
            return
        end
    end
end

local function SPNST()
    for mobj in mobjs.iterate() do
        if mobj.type == MT_EGGSPIN then
			mobj.state = S_SPINSHOT
			mobj.info.painstate = S_SPINPAIN
			mobj.info.spawnstate = S_SPINSPAWN
			mobj.info.seestate = S_SPINACT
            return
        end
    end
end
states[S_SPINSPAWN] = {
	//$Sprite SPNR
	sprite = SPR_SPNR,
	frame = A,
	tics = 4,
	nextstate = S_SPINSTAND
}
states[S_SPINSTAND] = {
	//$Sprite SPNR
	sprite = SPR_SPNR,
	frame = A|FF_ANIMATE,
	var1 = 2, 
	var2 = 1,
	tics = 20,
	nextstate = S_SPINLOOK
}
states[S_SPINLOOK] = {
	//$Sprite SPNR
	sprite = SPR_SPNR,
	frame = A,
	tics = 5,
	action = A_Look,
	var1 = 1,
	nextstate = S_SPINLOOK
}
states[S_SPINACT] = {
	//$Sprite SPNR
	sprite = SPR_SPNR,
	frame = A,
	tics = 5,
	action = A_SPINBRANCH,
	nextstate = S_SPINLOOK
}
states[S_SPINJET] = {
	//$Sprite SPNR
	sprite = SPR_SPNR,
	frame = A|FF_ANIMATE,
	var1 = 2, 
	var2 = 1,
	tics = 32,
	action = A_SplitShot,
	var1 = 10,
	var2 = (156 << 16) + MT_FBOMB,
	nextstate = S_SPINJET
}
states[S_SPINSHOT] = {
	//$Sprite SPNR
	sprite = SPR_SPNR,
	frame = A|FF_ANIMATE,
	var1 = 2, 
	var2 = 1,
	tics = 32,
	action = A_FireShot,
	var1 = MT_MINE,
	var2 = 48,
	nextstate = S_SPINSHOT
}

states[S_SPINSPIK] = {
	//$Sprite SPNR
	sprite = SPR_SPNR,
	frame = A|FF_ANIMATE,
	var1 = 2,
	var2 = 1,
	tics = 1,
	action = A_Boss1Spikeballs,
	var1 = 1,
	var2 = 4,
	nextstate = S_SPINSPIK2
}
states[S_SPINSPIK2] = {
	//$Sprite SPNR
	sprite = SPR_SPNR,
	frame = A|FF_ANIMATE,
	var1 = 2,
	var2 = 1,
	tics = 1,
	action = A_Boss1Spikeballs,
	var1 = 2,
	var2 = 4,
	nextstate = S_SPINSPIK3
}
states[S_SPINSPIK3] = {
	//$Sprite SPNR
	sprite = SPR_SPNR,
	frame = A|FF_ANIMATE,
	var1 = 2,
	var2 = 1,
	tics = 1,
	action = A_Boss1Spikeballs,
	var1 = 3,
	var2 = 4,
	nextstate = S_SPINSPIK4
}
states[S_SPINSPIK4] = {
	//$Sprite SPNR
	sprite = SPR_SPNR,
	frame = A|FF_ANIMATE,
	var1 = 2,
	var2 = 1,
	tics = 1,
	action = A_Boss1Spikeballs,
	var1 = 4,
	var2 = 4,
	nextstate = S_SPIKED
}
states[S_SPIKED] = {
	//$Sprite SPBR
	sprite = SPR_SPBR,
	frame = A|FF_ANIMATE,
	var1 = 2, 
	var2 = 1,
	tics = 32,
	action = A_MultiShot,
	var1 = (MT_POINTYBALL << 16) + 8,
	var2 = 128,
	nextstate = S_SPIKED2
}
states[S_SPIKED2] = {
	//$Sprite SPBR
	sprite = SPR_SPBR,
	frame = A|FF_ANIMATE,
	var1 = 2, 
	var2 = 1,
	tics = 32,
	action = A_MultiShot,
	var1 = (MT_POINTYBALL << 16) + 8,
	var2 = -20,
	nextstate = S_SPIKED3
}
states[S_SPIKED3] = {
	//$Sprite SPBR
	sprite = SPR_SPBR,
	frame = A|FF_ANIMATE,
	var1 = 2, 
	var2 = 1,
	tics = 32,
	action = A_MultiShot,
	var1 = (MT_POINTYBALL << 16) + 8,
	var2 = 50,
	nextstate = S_SPIKED
}
states[S_GROUNDMACE] = {
	//$Sprite SPBR
	sprite = SPR_SPBR,
	frame = A|FF_ANIMATE,
	var1 = 2, 
	var2 = 1,
	tics = 32,
	action = A_MultiShot,
	var1 = (MT_SMALLMACE << 16) + 8,
	var2 = -20,
	nextstate = S_GROUNDMACE
}
states[S_SPINBOUNCE] = {
	//$Sprite FITE
	sprite = SPR_FITE,
	frame = A|FF_ANIMATE,
	var1 = 3, 
	var2 = 1,
	tics = 32,
	flags = MF_SPECIAL|MF_BOSS|MF_SHOOTABLE,
	nextstate = S_SPINBOUNCE
}
states [S_SPINPAIN] = {
	//$Sprite ROTP
	sprite = SPR_ROTP,
	tics = 17,
	action = A_lexicute,
	flags = MF_SPECIAL|MF_BOSS|MF_SHOOTABLE,
	nextstate = S_SPINHIT
}

states [S_SPINHIT] = {
	//$Sprite ROTP
	sprite = SPR_ROTP,
	tics = 14,
	flags = MF_SPECIAL|MF_BOSS|MF_SHOOTABLE|MF2_FRET,
	nextstate = S_SPINSPAWN
}
states[S_FLYTUR] = {
	//$Sprite FITE
	sprite = SPR_FITE,
	frame = A|FF_ANIMATE,
	var1 = 3, 
	var2 = 1,
	tics = 32,
	action = A_TurretFire,
	var1 = MT_TURRETLASER,
	var2 = 2048,
	flags = MF_SPECIAL|MF_BOSS|MF_SHOOTABLE,
	nextstate = S_FLYCOOL
}
states[S_FLYCOOL] = {
	//$Sprite FITE
	sprite = SPR_FITE,
	frame = A|FF_ANIMATE,
	var1 = 3, 
	var2 = 1,
	tics = 64,
	action = A_TurretStop,
	nextstate = S_FLYSTAND
}
states[S_FLYSTAND] = {
	//$Sprite FITE
	sprite = SPR_FITE,
	frame = A|FF_ANIMATE,
	var1 = 3, 
	var2 = 1,
	tics = 8,
	flags = MF_SPECIAL|MF_BOSS|MF_SHOOTABLE,
	nextstate = S_FLYACT
}
states[S_FLYLOOK] = {
	//$Sprite FITE
	sprite = SPR_FITE,
	frame = A,
	tics = 5,
	action = A_Look,
	var1 = 1,
	nextstate = S_FLYACT
}
states[S_FLYACT] = {
	//$Sprite SPNR
	sprite = SPR_SPNR,
	frame = A,
	tics = 5,
	action = A_SPINBRANCH,
	nextstate = S_FLYTUR
}

states [S_FLYPAIN] = {
	//$Sprite FLRP
	sprite = SPR_FLRP,
	tics = 35,
	action = A_lexicute,
	flags = MF_SPECIAL|MF_BOSS|MF_SHOOTABLE,
	nextstate = S_FLYHIT
}

states [S_FLYHIT] = {
	//$Sprite FLRP
	sprite = SPR_FLRP,
	tics = 14,
	flags = MF_SPECIAL|MF_BOSS|MF_SHOOTABLE|MF2_FRET,
	nextstate = S_FLYSTAND
}
states [S_FLYDIE] = {
	//$Sprite FLED
	sprite = SPR_FLED,
	tics = 14,
	flags = MF_SPECIAL|MF_BOSS|MF_SHOOTABLE|MF2_FRET,
	action = A_BossScream,
	nextstate = S_FLYDIE2
}
states [S_FLYDIE2] = {
	//$Sprite FLED
	sprite = SPR_FLED,
	tics = 14,
	flags = MF_SPECIAL|MF_BOSS|MF_SHOOTABLE|MF2_FRET,
	action = A_BossScream,
	nextstate = S_FLYDIE2
}
states [S_FLYDIE3] = {
	//$Sprite FLED
	sprite = SPR_FLED,
	tics = 14,
	flags = MF_SPECIAL|MF_BOSS|MF_SHOOTABLE|MF2_FRET,
	action = A_BossScream,
}

addHook("LinedefExecute", DIES, "DIES")
addHook("LinedefExecute", SPNF, "SPNF")
addHook("LinedefExecute", SPNST, "SPNST")